# -*- coding: utf-8 -*-
# @File     : comm_driver.py.py
# @Project  : letCodeCase
# @Author   : 熊剑文
# @Time     : 2024/9/5 10:59:33
# @Copyright: 江西博微新技术有限公司
from configs.env import Env

"""
模块描述：
    
"""
from selenium import webdriver

class  Singleton(object):  #单例的实现有4种方法
    #_instance = None   不能这么写
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls,'_instance'):  # 此处不能用__instance
            # 如果没有_instance 属性（实例）就新建一个，否则就用之前的！
            cls._instance = super(Singleton,cls).__new__(cls, *args, **kwargs)
        return cls._instance

class  Singleton1(object):  #单例的实现有4种方法
    _instance = None
    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            # 这里有个笔误 应该是Singleton1
            cls._instance = super(Singleton1,cls).__new__(cls, *args, **kwargs)
        return cls._instance

class CommDriver(Singleton):  #keys.py->Keys # by.py==>By
    """
    通用的浏览器类
        1. 不同的浏览器
        2. 是否有头无头
        3. 最大化操作
        4. 页面加载时间
    """
    driver = None

    def get_driver(self,
                   browser_type=Env.BROWSER_TYPE,
                   headless_flag=Env.HEADLESS_FLAG):
        """
        打开一个浏览器实例，继承单例，可以配置无头有头，最大化，设置页面加载最大超时时间
        Args:
            browser_type: 浏览器类型，默认是 谷歌
            headless_flag: 有头无头的标记，默认有头

        Returns: 浏览器实例

        """
        if self.driver is None: #没有打开过浏览器
            if headless_flag:  #  headless_flag 为真的时候 无头
                if browser_type == 'chrome':
                    option = webdriver.ChromeOptions()
                    option.add_argument('--headless')
                    self.driver = webdriver.Chrome(options=option)
                elif browser_type == 'firefox':
                    option = webdriver.FirefoxOptions()
                    option.add_argument('--headless')
                    self.driver = webdriver.Firefox(options=option)
                elif browser_type == 'edge':
                    option = webdriver.EdgeOptions()
                    option.add_argument('--headless')
                    option.add_argument('--user-data-dir='+r"C:/Users/Administrator/AppData/Local/Microsoft/Edge/User Data/")
                    self.driver = webdriver.Edge(options=option)
                # TODO 如果你需要更多的浏览器支持，那写在这里，但不要忘了还要驱动的支持！
            else:   # headless_flag 为假的时候 有头
                if browser_type == 'chrome':
                    self.driver = webdriver.Chrome()
                elif browser_type == 'firefox':
                    self.driver = webdriver.Firefox()
                elif browser_type == 'edge':
                    option = webdriver.EdgeOptions()
                    option.add_argument('--user-data-dir='+r"C:/Users/Administrator/AppData/Local/Microsoft/Edge/User Data/")
                    self.driver = webdriver.Edge()

            self.driver.maximize_window()  #最大化
            self.driver.set_page_load_timeout(Env.PAGE_LOAD_TIMEOUT) #设定页面加载时间
            # self.driver.implicitly_wait(Env.PAGE_LOAD_TIMEOUT)

        return self.driver

if __name__ == '__main__':
    test_flag = 4
    if test_flag ==4:  #加上继承再测试 加上 if self.driver is None 处理 ===>True
        # 这个思想跟 loguru的单例是一回事
        d1 = CommDriver().get_driver()
        d2 = CommDriver().get_driver()
        print(id(d1)==id(d2))  #不打开浏览器


    if test_flag ==3:  #加上继承再测试 去掉get_driver  ===>True
        # 这个思想跟 loguru的单例是一回事
        d1 = CommDriver()
        d2 = CommDriver()
        print(id(d1)==id(d2))  #不打开浏览器

    if test_flag ==2:  #加上继承再测试  ===>false
        d1 = CommDriver().get_driver()
        d2 = CommDriver().get_driver()
        print(id(d1)==id(d2))
    if test_flag ==1:  #先不继承   ==>false
        d1 = CommDriver().get_driver()
        d2 = CommDriver().get_driver()
        print(id(d1)==id(d2))
